package com.wjw.java.basic.array_;

import java.util.Arrays;

/**
 * 数组相关操作：
 * 1.数组拷贝
 * 2.数组的反转
 * 3.数组的扩容
 * 4.数组的缩减
 */
public class ArrayOperation {
    public static void main(String[] args) {
        arrayCopy();
        System.out.println("---------------------------");
        arrayReverse1();
        arrayReverse2();
        System.out.println("---------------------------");
        arrayExpansion();
        System.out.println("---------------------------");
        arrayReduce();
    }

    /**
     * 1.数组的拷贝：要求新开辟一个空间拷贝
     */
    public static void arrayCopy(){
        int [] array = {10,20,30};
        //在堆中新开辟空间,并将array中的元素拷贝到array2中
        int [] array2 = new int[array.length];
        for (int i = 0; i < array.length; i++) {
            array2[i] = array[i];
        }
        System.out.println(Arrays.toString(array2));
        //此时修改array2中的数据,不会影响到array,因为他们指向不同的堆内存地址
        array2[2] = 300;
        System.out.println("修改后的array2："+Arrays.toString(array2));
        System.out.println("修改后的array："+Arrays.toString(array));
    }

    /**
     * 2-1.数组反转1
     */
    public static void arrayReverse1(){
        int [] array = {10,20,30,40,50};
        int temp = 0;
        int len = array.length;
        /**
         * i = 0时,
         * array[0]：为下标为0的元素
         * array[array.length -1 -0]：为下标为4的元素
         * 交换次数 = 数组长度 / 2
         */
        for (int i = 0; i < len / 2; i++) {
            temp = array[len -1 -i];//将下标为4的值赋给temp
            array[len -1 -i] = array[i];//将下标为0的值赋值给下标为4的
            array[i] = temp;
        }
        System.out.println("反转后的数组："+Arrays.toString(array));
    }

    /**
     * 2-2.数组反转2
     */
    public static void arrayReverse2(){
        int [] array = {10,20,30,40,50};
        int [] array2 = new int[array.length];
        /**
         * i从4开始递减
         * j从0开始递增
         */
        for (int i = array.length -1,j = 0; i >= 0; i--,j++) {
            array2[j] = array[i];
        }
        System.out.println("反转前的数组："+Arrays.toString(array));
        System.out.println("反转后的数组："+Arrays.toString(array2));
    }

    /**
     * 3.数组扩容：往数组的最后面添加一个元素
     */
    public static void arrayExpansion(){
        int [] array = {1,2,3,4,5};
        //新增一个数组,将原始数组的长度上 + 1
        int [] array2 = new int[array.length + 1];
        //将原始数组中的所有元素拷贝到新数组
        for (int i = 0; i < array.length; i++) {
            array2[i] = array[i];
        }
        //新数组的尾部添加元素：6
        array2[array2.length-1] = 6;
        //修改原始数组的内存地址,指向新数组的内存地址
        array = array2;
        System.out.println(Arrays.toString(array));
        System.out.println(Arrays.toString(array2));
    }

    /**
     * 4.数组缩减：移除数组的最后一个元素
     */
    public static void arrayReduce(){
        int [] array = {1,2,3,4,5};
        //新增一个数组,将原始数组的长度上 - 1
        int [] array2 = new int[array.length - 1];
        //将原始数组中的所有元素拷贝到新数组
        for (int i = 0; i < array2.length; i++) {
            array2[i] = array[i];
        }
        //修改原始数组的内存地址,指向新数组的内存地址
        array = array2;
        System.out.println(Arrays.toString(array));
        System.out.println(Arrays.toString(array2));
    }
}
